package com.mastercard.assets.util.languages ;

import java.text.MessageFormat;
import java.util.Formatter;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * 	Clase que manejara los mensajes tanto del servidor como de los plugins.
 * 
 * 	La logica de negocios que seguira este componente es registrar la base del archivo de mensajes,
 * 	el pais y el lenguaje. A partir de estos datos, se obtendra el ResourceBundle con el Locale
 * 	correspondiente. En caso de que el usuario necesite cambiar el Locale, tambien se registra para 
 * 	que pueda obtener el mensaje correspondientea dicho Locale.
 * 
 * 	@author www.gumer.com.mx
 *
 */
public class MCMessages
{
	private String base = "" ;
	private String country = "" ;
	private String language = "" ;
	
	// locale por default
	private Locale defaultLocale = Locale.getDefault( ) ;
	
	// Locale actual
	private Locale actualLocale ;
	
	// Hashtable para guardar los ResourceBundle
	private java.util.Hashtable< Locale , ResourceBundle > resourceBundles = new java.util.Hashtable< Locale , ResourceBundle >( ) ;

	/**
	 * 	Constructor que establece la base para este manejador de mensajes, y los
	 * 	country y language por default.
	 * 
	 * 	@param base 		Nombre base del archivo
	 * 	@param country		Pais por default del Locale archivo.
	 * 	@param language		Lenguaje por default del Locale archivo.
	 */
	public MCMessages( String base , String country , String language )
	{
		super();
		this.base = base;
		
		// en caso de que country sea null
		if( country == null || country.trim( ).length( ) == 0 )
			country = defaultLocale.getCountry( ) ;
		
		// en caso de que language sea null
		if( language == null || language.trim( ).length( ) == 0 )
			language = defaultLocale.getLanguage( ) ;
		
		actualLocale = new Locale( language , country ) ;
		
		// levanta el ResourceBundle con el default
		resourceBundles.put( defaultLocale , ResourceBundle.getBundle( base , defaultLocale ) ) ;
		
		// levanta el ResourceBundle con el actual
		resourceBundles.put( actualLocale , ResourceBundle.getBundle( base , actualLocale ) ) ;
	}
	
	/**
	 * 	Constructor que establece la base para este manejador de mensajes, y los
	 * 	country y language por default.
	 * 
	 * 	@param base 		Nombre base del archivo
	 * 	@param country		Pais por default del Locale archivo.
	 * 	@param language		Lenguaje por default del Locale archivo.
	 */
	public MCMessages( String base )
	{
		super();
		this.base = base;
		
		actualLocale = defaultLocale ;
		
		// levanta el ResourceBundle con el default
		resourceBundles.put( defaultLocale , ResourceBundle.getBundle( base , defaultLocale ) ) ;
	}
	
	/**
	 * 	Obtiene el mensaje de la llave dada para el Locale actual de la clase.
	 * 
	 * 	@param key Llave a obtener el mensaje.
	 * 	@return Mensaje que esta en la llave dada.
	 */
	public String getString( String key )
	{
		return ResourceBundle.getBundle( base , actualLocale ).getString( key ) ;
	}
	
	/**
	 * 	Obtiene el mensaje de la llave dada para el Locale dado.
	 * 
	 * 	@param key Llave a obtener el mensaje.
	 * 	@param locale Locale a obtener el mensaje.
	 * 	@return Mensaje que esta en la llave dada.
	 */
	public String getString( String key , Locale locale )
	{
		return ResourceBundle.getBundle( base , locale ).getString( key ) ;
	}
	
	/**
	 * 	Obtiene el mensaje de la llave dada para el Locale actual de la clase.
	 * 
	 * 	@param key Llave a obtener el mensaje.
	 * 	@return Mensaje que esta en la llave dada.
	 */
	public String getString( String key , Object... objects  )
	{
		return MessageFormat.format( ResourceBundle.getBundle( base , actualLocale ).getString( key ) , objects ) ;
	}
	
	/**
	 * 	Obtiene el mensaje de la llave dada para el Locale dado.
	 * 
	 * 	@param key Llave a obtener el mensaje.
	 * 	@param locale Locale a obtener el mensaje.
	 * 	@return Mensaje que esta en la llave dada.
	 */
	public String getString( String key , Locale locale , Object... objects )
	{
		return MessageFormat.format( ResourceBundle.getBundle( base , locale ).getString( key ) , objects ) ;
	}
	
	public void setActualLocale( Locale locale )
	{
		// en caso de no null
		if( locale != null )
			this.actualLocale = locale ;
	}
}
